GskVulkanImage *target;
VkSampler sampler;
+ VkSampler repeating_sampler;
GList *render_passes;
GSList *cleanup_images;
NULL,
&self->sampler);
+ GSK_VK_CHECK (vkCreateSampler, device,
+ &(VkSamplerCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
+ .magFilter = VK_FILTER_LINEAR,
+ .minFilter = VK_FILTER_LINEAR,
+ .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+ .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+ .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+ .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
+ .unnormalizedCoordinates = VK_FALSE,
+ .maxAnisotropy = 1.0,
+ },
+ NULL,
+ &self->repeating_sampler);
+
self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
#ifdef G_ENABLE_DEBUG
typedef struct {
gsize index;
GskVulkanImage *image;
+ gboolean repeat;
} HashDescriptorSetIndexEntry;
static guint
{
const HashDescriptorSetIndexEntry *e = v;
- return GPOINTER_TO_UINT (e->image);
+ return GPOINTER_TO_UINT (e->image) + e->repeat;
}
static gboolean
const HashDescriptorSetIndexEntry *e1 = v1;
const HashDescriptorSetIndexEntry *e2 = v2;
- return e1->image == e2->image;
+ return e1->image == e2->image && e1->repeat == e2->repeat;
}
gsize
gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
- GskVulkanImage *source)
+ GskVulkanImage *source,
+ gboolean repeat)
{
HashDescriptorSetIndexEntry lookup;
HashDescriptorSetIndexEntry *entry;
g_assert (source != NULL);
lookup.image = source;
+ lookup.repeat = repeat;
entry = g_hash_table_lookup (self->descriptor_set_indexes, &lookup);
if (entry)
entry = g_new (HashDescriptorSetIndexEntry, 1);
entry->image = source;
+ entry->repeat = repeat;
entry->index = g_hash_table_size (self->descriptor_set_indexes);
g_hash_table_add (self->descriptor_set_indexes, entry);
HashDescriptorSetIndexEntry *entry = key;
GskVulkanImage *image = entry->image;
gsize id = entry->index;
+ gboolean repeat = entry->repeat;
vkUpdateDescriptorSets (device,
1,
.descriptorCount = 1,
.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
.pImageInfo = &(VkDescriptorImageInfo) {
- .sampler = self->sampler,
+ .sampler = repeat ? self->repeating_sampler : self->sampler,
.imageView = gsk_vulkan_image_get_image_view (image),
.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
}
self->sampler,
NULL);
+ vkDestroySampler (device,
+ self->repeating_sampler,
+ NULL);
+
gsk_vulkan_command_pool_free (self->command_pool);
g_slice_free (GskVulkanRender, self);
case GSK_VULKAN_OP_OPACITY:
case GSK_VULKAN_OP_BLUR:
case GSK_VULKAN_OP_COLOR_MATRIX:
- op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source);
+ op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, FALSE);
break;
case GSK_VULKAN_OP_TEXT:
case GSK_VULKAN_OP_COLOR_TEXT:
- op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source);
+ op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source, FALSE);
break;
case GSK_VULKAN_OP_CROSS_FADE:
case GSK_VULKAN_OP_BLEND_MODE:
- op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source);
- op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source2);
+ op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, FALSE);
+ op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source2, FALSE);
break;
default: